package com.itany.mybatis.dao;

import com.itany.mybatis.entity.User;
import com.itany.mybatis.entity.User2;
import com.itany.mybatis.entity.UserDo;
import org.apache.ibatis.annotations.Param;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Description: 类的描述
 * Author: liudaolin@itany.com
 * Date: 2021/07/16 11:13
 * Version: 1.0 版本信息
 */
public interface UserDao {
    // 提供一个 dao 接口, 实现类由 mybatis 实现
    void insertUser2();

    // 添加用户, 动态获取参数值
    // 目前只能传一个对象, 只能获取该对象的属性值
    void insertUser3(User user);
    List<User> selectAll();

    User selectAll1();
    void updateById(User user);

    void deleteById(User user);
    User selectById(User user);
    Set<User> selectById2(User user);

    /**
     * 添加并返回主键, 不是通过返回值返回主键, 而是设置到 参数中的 属性中
     * @param user
     */
    void insertUserReturnKey(User user);


    List<HashMap<String, String>> selectAll3();
    List<User> selectAll4();
    List<User2> selectAll5();

    /**
     * 手动映射
     * @return
     */
    List<User2> selectAll6();

    /**
     * 参数是Map, 用法和 普通对象相同
     * @param map
     * @return
     */
    List<User> selectByMap(Map<String, String> map);

    /**
     * 一个简单类型的参数
     * @param userId
     * @return
     */
    User selectByUserId(Integer userId);

    /**
     * 规范的写法, 需要给此类简单类型参数 定义使用的名称, 使用 注解Param 定义参数名称
     * @param userId
     * @return
     */
    User selectByUserId2(@Param("id") Integer userId);

    /**
     * 多个参数
     * @param name
     * @param pwd
     * @return
     */
    User selectByNameAndPwd(String name, String pwd);

    /**
     * 多参数, 建议给每一个参数使用注解 Param 指定名称
     * @param name
     * @param pwd
     * @return
     */
    User selectByNameAndPwd2(@Param("pwd") String pwd, @Param("name") String name);

    /**
     * 多参数, 建议给每一个参数使用注解 Param 指定名称
     * @param user
     * @param beginAge
     * @param endAge
     * @return
     */
    List<User> selectByNameAndAgeRange(@Param("user") User user,
                                       @Param("beginAge") Integer beginAge,
                                       @Param("endAge") Integer endAge);

    /**
     * 模糊查询
     * @param user
     * @return
     */
    List<User> selectByFuzzy1(User user);
    /**
     * 根据id动态修改用户信息
     * @param user
     */
    void updateById2(User user);

    /**
     * where标签
     * @param user
     * @return
     */
    List<User> selectByFuzzy2(User user);
    /**
     * set标签
     * @param user
     */
    void updateById3(User user);
    /**
     * trim标签
     * @param user
     * @return
     */
    List<User> selectByFuzzy3(User user);

    /**
     * trim标签
     * @param user
     */
    void updateById4(User user);

    List<User> selectByNameLikeTest(String name);
    /**
     * 根据名称模糊查询
     * @param name
     * @return
     */
    List<User> selectByNameLike(@Param("name") String name);

    // 遍历数组
    void deleteByIds1(int[] ids);
    // 遍历List集合
    void deleteByIds2(List<Integer> ids);
    // 遍历对象的某个 数组/集合 属性
    void deleteByIds3(UserDo userDo);
    // 遍历map中某个key (数组/集合类型)的值
    void deleteByIds4(Map<String, List<Integer>> map);

    // 查询对应id的用户
    List<User> selectByIds1(int[] ids);// in
    List<User> selectByIds2(int[] ids);// 不使用 in

    /**
     * 根据操作类型查询
     * 如果type=1, 则查询 age >= 10 的用户<br>
     * 如果type=2, 则查询 age >= 30 的用户<br>
     * 否则 查询 age >= 60 的用户<br>
     * @param type
     * @return
     */
    List<User> selectByType(@Param("type") int type);

    /**
     * 动态添加某个表的指定列的值
     * @param param 相关参数(表名,列名,列值)
     */
    void insertObject(Map<String, Object> param);
}
